Skip to content

ASP.NET Core 命名空間衝突問題

TLDR

  • 當專案名稱包含 SystemMicrosoft 等關鍵字時,極易引發命名空間(Namespace)衝突。
  • 衝突發生時,編譯器會誤將專案內的命名空間與系統核心命名空間混淆,導致 Razor View 編譯失敗。
  • 即使關閉 Global Using Directives 或降級至 .NET 5,Razor 檔案仍會因為其內部的自動產生機制而發生衝突。
  • 解決方案:避免在專案名稱中使用 SystemMicrosoft
  • 若已發生衝突,可嘗試在 _ViewImports.cshtml_ViewStart.cshtml 中使用 @namespace 指令明確指定命名空間,但最根本的做法仍是更名專案。

發生情境

當專案名稱(Namespace)包含 SystemMicrosoft 等關鍵字時,編譯器在處理 Razor View 時會產生命名空間衝突。

什麼情況下會遇到這個問題:當開發者將專案名稱命名為包含 System 的字串(例如 TestNameSpace.System),並在 ASP.NET Core 專案中使用 Razor Pages 或 MVC Views 時。

此時編譯錯誤訊息會顯示類似 命名空間 'TestNameSpace.System' 中沒有類型或命名空間 'Threading' 的錯誤,這是因為編譯器將 System.Threading 誤判為 TestNameSpace.System.Threading,導致無法正確解析系統核心類別。

razor compilation errors

Global Using Directives 與隱含引用

什麼情況下會遇到這個問題:使用 .NET 6 以上版本,且專案啟用了 C# 10 的 Global Using Directives 功能。

在專案建置過程中,系統會產生一個 {專案名稱}.GlobalUsings.g.cs 檔案,其中包含預設的系統命名空間引用:

csharp
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

若專案名稱與這些命名空間重疊,編譯器會優先解析到專案內的命名空間,進而導致找不到系統類型的錯誤。

global using directives settingscsproj global usingsobj folder global usings

Razor View 的命名空間解析機制

什麼情況下會遇到這個問題:即使關閉了 Global Using 或使用舊版 .NET Framework,Razor 檔案在編譯時仍會自動產生對應的 C# 程式碼,這些程式碼會受到專案根命名空間(Root Namespace)的影響。

透過檢查 obj 目錄下產生的 .g.cs 檔案,可以發現 Razor 頁面在編譯時會自動引用特定的命名空間。若要嘗試修正,可以在 _ViewStart.cshtml 或相關設定檔中明確定義 @namespace

csharp
@using TestNamespace.Sys.Web
@* 將 System 改為 Sys,避免與系統命名空間衝突 *@
@namespace TestNamespace.Sys.Web.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

TIP

上述針對 .g.cs 的路徑分析主要基於 .NET 5 環境,不同版本的 ASP.NET Core 其編譯產物路徑可能有所差異。

結論與建議

  • 核心建議:在建立 ASP.NET Core 專案時,應嚴格避免將專案名稱命名為 SystemMicrosoft,這是預防此類編譯衝突最有效的方法。
  • 專案命名規範:建議使用公司名稱或專案功能作為前綴,確保命名空間的唯一性,避免與 .NET 基礎類別庫(BCL)產生名稱碰撞。

異動歷程

    • 初版文件建立。